/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.dao;

import br.com.folha.entity.DiaSemana;
import br.com.folha.entity.DisponibilidadeProfessor;
import br.com.folha.entity.Professor;
import br.com.folha.utilidades.HibernateUtil;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.NoResultException;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author marceloml
 */
public class DisponibilidadeDao implements Serializable {
    
    private static final long serialVersionUID = 1L;            
    private List<DisponibilidadeProfessor> retorno;
    
    public List<DisponibilidadeProfessor> listaDisponibilidadeProfessor(Integer professor, Integer unidade, Integer tipoContrato) {
        Session sessao = HibernateUtil.getSessionFactory();
        Criteria criteria = sessao.createCriteria(DisponibilidadeProfessor.class);  
        criteria.createAlias("diaSemana", "ds");
        criteria.createAlias("professorUnidadeTipologia", "p");
        criteria.createAlias("tipoContrato", "t");
        
        criteria.add(Restrictions.eq("p.unidade.id", unidade));
        criteria.add(Restrictions.eq("professor", professor));
        criteria.add(Restrictions.eq("t.id", tipoContrato));
        criteria.addOrder(Order.asc("ds.id"));
        criteria.addOrder(Order.asc("hora_ini"));
        
        List lista = criteria.list();
        sessao.close();
        return lista;      
    }     
    
    public List<DisponibilidadeProfessor> listaDisponibilidadeUnidade(Integer unidade) {
        Session sessao = HibernateUtil.getSessionFactory();
        Criteria criteria = sessao.createCriteria(DisponibilidadeProfessor.class);  
        criteria.createAlias("diaSemana", "ds");
        criteria.createAlias("professorUnidadeTipologia", "p");
        
        criteria.add(Restrictions.eq("p.unidade.id", unidade));
        criteria.addOrder(Order.asc("ds.id"));
        criteria.addOrder(Order.asc("hora_ini"));
        
        List lista = criteria.list();
        sessao.close();
        return lista;      
    }    
    
    public List<DisponibilidadeProfessor> listaDisponibilidade(Object t, Integer professor) {
        Session sessao = HibernateUtil.getSessionFactory();
        Criteria criteria = sessao.createCriteria(t.getClass());  
        criteria.createAlias("diaSemana", "ds");
        
        criteria.add(Restrictions.eq("professor", professor));
        criteria.addOrder(Order.asc("ds.id"));
        criteria.addOrder(Order.asc("hora_ini"));
        
        List lista = criteria.list();
        sessao.close();
        return lista;      
    }    
    
    public List<DisponibilidadeProfessor> consultaDisponibilidadeProfessor(Professor professor, DiaSemana dia, Date horaini, Date horafim) {
        Session sessao = HibernateUtil.getSessionFactory();
        
         Query query  = sessao.createQuery("from DisponibilidadeProfessor where cd_professor=:pprofessor and diaSemana =:pdia and hora_ini <=:phoraini and hora_fim >= :phorafim");
       
        query.setParameter("pprofessor",professor);        
        query.setParameter("pdia",dia);
        query.setParameter("phoraini",horaini);
        query.setParameter("phorafim",horafim);
        
            try{
             retorno = query.list();
            }catch(NoResultException e){
                retorno=null;
            }finally{
                sessao.close();
            }
            return retorno;       
    }    
    
    public List<DisponibilidadeProfessor> consultaDisponibilidadeProfessorDia(Professor professor, DiaSemana dia) {
        Session sessao = HibernateUtil.getSessionFactory();
        
         Query query  = sessao.createQuery("from DisponibilidadeProfessor where cd_professor=:pprofessor and diaSemana =:pdia");
       
        query.setParameter("pprofessor",professor);        
        query.setParameter("pdia",dia);
        
            try{
             retorno = query.list();
            }catch(NoResultException e){
                retorno=null;
            }finally{
                sessao.close();
            }
            return retorno;       
    }    
    
}
